package com.maven.springmvc.controller;


import com.maven.springmvc.model.UserInfo;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;


@RequestMapping("/request")
@RestController
// 告诉 spring 叫它帮我们管理这些程序
public class RequestController {
    // 如果我这里想 传一个 json 格式的请求,
    // 这里就是将json格式的数据直接转化为UserInfo的对象

    // 这里需要注意的一点就是，当我们 在这个类中重写的新的构造方法的时候，
    // 我们应该将 默认的构造方法也写出来，
    // 因为在 spring 获取 到json格式的数据之后，
    // 首先 会调用默认构造函数构造出一个对象，
    // 然后在将值 赋给 相应的变量
    @RequestMapping("/r1")
    // 这里的 @RequestBody  不能省略
    public String r1(@RequestBody UserInfo userInfo) {
        return userInfo.toString();
    }



    // 如何获取 URL 中的 参数
    @RequestMapping("/r2/{name}/{age}")
    // 这里的 @PathVariable 相当于标识 传递的参数在 URL 中，不可省略，否则就获取不到
    // 还有 我们设置的参数 名称 应当与 URL 中的一致，否则也可能获取不到
    // 当然如果想修改名字，也可以 @PathVariable("name") 进行名称的修改
    public String r2(@PathVariable("name") String username, @PathVariable  String age) {
        return "name :" + username + " age :" + age;
    }


    // 当然我们还可能 上传文件
    @RequestMapping("/r3")
    // @RequestPart 这个可以省略
    public String r3(@RequestPart MultipartFile file) throws IOException {
        // 这里是获取 文件的名字
        file.getOriginalFilename();
        // 这里是将 文件上传到指定 位置 这里 路径 还需 加个 /
        file.transferTo(new File("E:/aaa/bbb/"+file.getOriginalFilename()));
        return "上传成功";
    }



    // 当然我们在网页中可以自行设置 cookie ，在postman 中我们则需要自己构建
    @RequestMapping("/r4")
    public String r4() {
        return "";
    }

    // 传统获取 cookie
    @RequestMapping("/r5")
    public String r5(HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies=request.getCookies();
        if(cookies == null)  return " cookie 为空 ";
        for(Cookie cookie:cookies){
            System.out.println(cookie.getName()+":"+cookie.getValue());
        }
        // 当然除了上述的 foreach 之外，我们还可以通过lambda表达式来抒写
        //Arrays.stream(cookies).forEach(x->System.out.println(x.getName()+":"+x.getValue()));

        return " 查询cookie完毕";
    }

    // 这里获取 cookie 只能获取一个，并且还是根据名字进行获取
    @RequestMapping("/r6")
    public String r6(@CookieValue("bite") String cookie) {
        if(cookie == null) return "cookie 不存在";
        return cookie;
    }

    @RequestMapping("/r7")
    public String r7(HttpServletRequest request) {
        // 这里 false 是 如果不存在 相应的 session 的话，如果设置为 false 就不会自动创建
        HttpSession session=request.getSession(true);
        session.setAttribute("username","java");
        return " session 设置成功";
    }

    @RequestMapping("/r8")
    public String r8(HttpServletRequest request) throws IOException {
        HttpSession session= request.getSession();
        // 这里也 是 根据名称来进行查询
        String username=(String) session.getAttribute("username");

        return "username :" + username;
    }

    // 这里的 @SessionAttribute 相当于将上面的 重复的 过程 都进行了包装，我们只需要对它进行接收就行
    // 注意  @SessionAttribute（） 中的名称不能 错
    @RequestMapping("/r9")
    public String r9(@SessionAttribute(value = "username",required = false) String name) {
        return "username :" + name;
    }

    // 获取 Header
    @RequestMapping("/r10")
    public String r10(HttpServletRequest request) {
        String userAgent=request.getHeader("User-Agent");

        return "User-Agent : "+userAgent;

    }

    // 同样的 包装了 重复的步骤
    @RequestMapping("/r11")
    public String r11(@RequestHeader("User-Agent") String userAgent) {
        return "User-Agent : "+userAgent;
    }
}
